import asyncio
import os
import sys
from fake_useragent import UserAgent
import tldextract
import traceback
import uuid
from urllib.parse import urlparse
import httpx
from PyQt6.QtGui import QIcon, QPixmap
from PyQt6.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, QWidget,
                             QPushButton, QFileDialog, QLineEdit, QLabel, QTextEdit, QSpinBox, QHBoxLayout)
from PyQt6.QtCore import QThread, pyqtSignal, QDateTime, QByteArray, QBuffer, QIODevice
from bs4 import BeautifulSoup

'''
V1.8:
    1.设置深度抓取，自动去重
    2.自动跟随重定向
    3.配置连接池的最大连接数和保持连接数，保持运行稳定
    4.随机UA
    5.输出优化更新 状态码不是200的显示黑色
    6.batch_size = 200  # 每批处理的URL数量 防止连接被耗尽
'''
icon_data = "AAABAAEAYGAAAAEAIAColAAAFgAAACgAAABgAAAAwAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAAEAAAABAAAAAIAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABgAAAAYAAAAGAAAABgAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAIAAAAEAAAABAAAAAYAAAAGAAAACAAAAAgAAAAKAAAACgAAAAwAAAAOAAAADgAAABAAAAASAAAAFAAAABYAAAAYAAAAGgAAABwAAAAeAAAAIAAAACIAAAAkAAAAJgAAACYAAAAmAAAAJgAAACQAAAAiAAAAIAAAAB4AAAAcAAAAGgAAABgAAAAWAAAAFAAAABIAAAAQAAAADgAAAA4AAAAMAAAACgAAAAoAAAAIAAAACAAAAAYAAAAGAAAABAAAAAQAAAACAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAgAAAAQAAAAGAAAABgAAAAgAAAAKAAAADgAAABAAAAASAAAAFAAAABYAAAAaAAAAHgAAACIAAAAoAAAALAAAADIAAAA6AAAAQAAAAEgAAABOAAAAVgAAAFwAAABiAAAAaAIBAG4FAwByCQYBdg4J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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9MNYcPS/X1jst1v85Ktb/NyjV/zUl1P8zI9P/MyHTuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANynWLDYp1uY0Jtb/MiTV/zAi1P8vH9P/MB/WgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALR3SADEl1UYwI9X2LiDV/y0e1P8rG9P/Lx/XTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArH9VqKh3V+iga1P8nGdX2KhzZIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGcsAJhnUiCQX1P8lF9vULx/jDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIhXUCiEU1KgiFOaqNyPsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0R0w4iFepKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////////////////////////////////////////////////////////////////////////////wAAA///////////8AAAAD//////////wAAAAA//////////gAAAAAf/////////gAAAAAf////////+AAAAAAH////////8AAAAAAD////////wAAAAAAB////////gAAAAAAAf///////AAAAAAAAP//////+AAAAAAAAH//////4AAAAAAAAD//////4AAAAAAAAB//////gAAAAAAAAA/////wAAAAAAAAAAf///4AAAAAH/4AAAP//+AAAAAA//+AAAP///AAAAAD///AAAH///gAAAAP///gAADx//wAAAA////wAAAB//4AAAD////4AAAB//8AAAH////4AAAD//4AAAf////8AAAD//4AAAf////8AAAH//wAAAf////+AAAH//wAAAf////+AAAH//gAAAf////wAAAP//gAAAf///+AAAAP//gAAAf///8AAAAP//AAAAf///+AAAAf//AAAAf////gAAAf//AAAAf////wAAAf//AAAAf////8AAAf//AAAA/////+AAAf/+AABg//////AAAP/+AADw//////wAAP/+AAD4//////4AAP/+AAH8//////+AAP/+AAH+//////+AAP/+AAP///////+AAP/+AAP///////+AAH/+AAf///////+AAH/+AAf///////+AAH/+AAf///////+AAH/+AAf///////+AAH/+AAf///////+AAH/+AAf///////+AAH//AAP///////+AAH//AAP///////+AAP//AAP///////+AAP//AAH///////+AAP//AAH///////+AAP//gAD///////8AAP//gAB///////8AAP//gAA///////8AAf//wAAf//////8AAf//wAAP//////4AAf//4AAH//////4AA///4AAD///5//wAA///8AAA///h//wAA///8AAAf/8B//gAB///+AAAH/wB//AAB////AAAB/AD/+AAD////AAAA8AD/8AAD////gAAAAAD/4AAH////wAAAAAD+AAAH////4AAAAAAAAAAP////8AAAAAAAAAAf////+AAAAAAAAAA//////AAAAAAAAAA//////gAAAAAAAAB//////wAAAAAAAAD//////4AAAAAAAAH//////+AAAAAAAAP///////gAAAAAAA////////wAAAAAAB////////8AAAAAAD/////////gAAAAAP/////////8AAAAAf//////////gAAAB///////////wAAAH///////////wAAA////////////4AAP////////////8A//////////////+A///////////////A///////////////h///////////////x///////////////x///////////////5///////////////////////8="
# 获取脚本所在的目录
script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
result_dir = ''  # 构造输出文件夹目录的绝对路径
first_file_path = ''  # 要查询的文件路径


class Worker:
    def __init__(self, blog_urls=None, time_out=None, max_concurrent_tasks=5, log_signal=None, grasp_depth=1):
        self.ua = UserAgent(
            fallback='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3')
        self.limits = httpx.Limits(max_connections=200, max_keepalive_connections=50)  # 配置连接池的最大连接数和保持连接数
        self.grasp_depth = grasp_depth  # 抓取深度
        self.time_out = time_out
        self.blog_urls = blog_urls if blog_urls is not None else []
        self.result_dir = result_dir  # 结果保存目录
        self.max_concurrent_tasks = max_concurrent_tasks
        self.log_signal = log_signal
        self.file_write_lock_error = asyncio.Lock()
        self.file_write_lock_success = asyncio.Lock()
        self.semaphore = asyncio.Semaphore(max_concurrent_tasks)  # 信号量控制并发任务数量
        if not os.path.exists(result_dir):  # 确保存放数据目录存在
            os.makedirs(result_dir)

    async def get_WindowsUa(self):
        return self.ua.random

    def log(self, message):
        if self.log_signal:
            self.log_signal.emit(message)

    async def fetch_url(self, client, url):
        try:
            response = await client.get(url, headers={'User-Agent': await self.get_WindowsUa()}, timeout=self.time_out)
            return response
        except:
            return None

    async def attempt_protocols(self, client, url):
        if url.startswith(('http:', 'https:')):
            response = await self.fetch_url(client, url)
            if response and response.status_code == 200:
                return url, response
            else:
                return None, None
        else:
            error_res = None
            protocols = ['http://', 'http://www.', 'https://', 'https://www.']
            for protocol in protocols:
                full_url = protocol + url
                response = await self.fetch_url(client, full_url)
                if response:
                    error_res = response
                    if response.status_code == 200:
                        return full_url, response
                    elif type(response.status_code) == int:
                        return full_url, response
            if error_res:
                return url, error_res
            else:
                return None, None

    def unique_domains(self, file_path):
        '''
        从单个文件中提取并返回去重的主域名列表。
        :param file_path: 单个文件的路径
        :return: 去重的主域名集合
        '''
        domain_set = set()
        try:
            with open(file_path, 'r', encoding='utf-8') as file:
                for line in file:
                    line = line.strip()  # 去除首尾空白字符
                    if line:  # 忽略空行
                        try:
                            extracted = tldextract.extract(line)
                            main_domain = extracted.domain + '.' + extracted.suffix
                            domain_set.add(main_domain)
                        except Exception as e:
                            print(f"Error parsing line: {line}. Error: {e}")
        except FileNotFoundError:
            print(f"File not found: {file_path}")
        return domain_set

    def extract_unique_domains_excluding_previous(self, file_paths):
        '''
        从列表中的最后一个文件中提取主域名，并去除前面文件中已存在的域名。
        :param file_paths: 包含TXT文件路径的列表
        :return: 从最后一个文件中提取的、去除前面文件中已存在域名的去重主域名列表
        '''
        if not file_paths:
            return []
            # 加载前面所有文件中的域名
        previous_domains = set().union(*[self.unique_domains(path) for path in file_paths[:-1]])
        # 加载并处理最后一个文件
        last_file_domains = self.unique_domains(file_paths[-1])
        # 去除前面文件中已存在的域名
        unique_domains = list(last_file_domains - previous_domains)
        return unique_domains

    async def write_list_to_txt(self, lst, filename):
        """
        将列表中的每个元素写入到文本文件中，每个元素占一行。
        参数:
        lst (list): 要写入文件的列表。
        filename (str): 输出文件的名称。
        """
        with open(filename, 'w', encoding='utf-8') as file:
            for item in lst:
                file.write(f"{item}\n")

    async def friend_url(self, response, domain_url):
        extracted = tldextract.extract(domain_url)
        main_domain = extracted.domain + '.' + extracted.suffix
        soup = BeautifulSoup(response.text, 'html.parser')
        friend_links = []
        for link in soup.find_all('a', href=True):
            href = link['href']
            if urlparse(href).path in ('', '/'):  # 去除多级目录的href
                if 'http' in href and main_domain not in href and 'gov.cn' not in href and href != 'https://' and href != 'http://':
                    friend_links.append(href)
        return friend_links

    async def write_list_to_txt(self, domain_list, filename):
        async with self.file_write_lock_success:
            with open(filename, 'w', encoding='utf-8') as f:
                for domain in domain_list:
                    f.write(domain + '\n')

    def merge_and_deduplicate_txt_files(self, txt_file_paths, output_file_path):
        """
        合并多个TXT文件并去重，将结果写入一个新的文件。
        :param txt_file_paths: 包含多个TXT文件路径的列表
        :param output_file_path: 结果输出文件的路径
        """
        seen_lines = set()
        # 遍历所有的文件路径
        for file_path in txt_file_paths:
            # 检查文件是否存在
            if os.path.isfile(file_path):
                with open(file_path, 'r', encoding='utf-8') as f:
                    for line in f:
                        clean_line = line.strip()
                        # 检查行是否已经出现过
                        if clean_line not in seen_lines:
                            seen_lines.add(clean_line)
            else:
                print(f"文件 {file_path} 不存在，跳过。")
        # 将结果写入新的文件
        with open(output_file_path, 'w', encoding='utf-8') as f:
            for line in seen_lines:
                f.write(line + '\n')
        print(f"合并完成，去重后的内容已写入 {output_file_path}")

    async def write_success(self, friend_url, text_name):
        async with self.file_write_lock_success:
            with open(os.path.join(self.result_dir, text_name), 'a', encoding='utf-8') as f:
                for url in friend_url:
                    if not isinstance(url, str):
                        url = str(url)
                    f.write(url + '\n')

    async def write_error(self, domain_url):
        async with self.file_write_lock_error:
            with open(os.path.join(self.result_dir, 'error.txt'), 'a', encoding='utf-8') as f:
                f.write(domain_url + '\n')

    async def process_batch(self, urls, text_name):
        # 使用上下文管理器确保在每批处理完成后释放资源
        async with httpx.AsyncClient(limits=self.limits, verify=False, follow_redirects=True) as client:
            tasks = [self.process_domain(client, url, text_name) for url in urls]
            await asyncio.gather(*tasks)

    async def process_domain(self, client, domain_url, text_name):
        async with self.semaphore:  # 使用信号量控制并发
            try:
                url, response = await self.attempt_protocols(client, domain_url)
                if response and response.status_code == 200:
                    friend_url = await self.friend_url(response, domain_url)
                    self.log(f"{domain_url}获取友链成功:{friend_url}")
                    if friend_url:
                        await self.write_success(friend_url, text_name)
                else:
                    await self.write_error(domain_url)
                    try:
                        self.log(
                            f'<span style="color:black;">{domain_url}获取友链失败Status_code:{response.status_code}</span>')
                        # self.log(f"{domain_url}获取友链失败Status_code:{response.status_code}")
                    except:
                        self.log(f"{domain_url}获取友链失败Status_code:失败")
            except Exception as e:
                self.log(f"Error processing domain {domain_url}: {e}")

    async def main(self):
        try:
            extract_txt_list = [f'{first_file_path}']  # 提取主域名TXT文件路径列表
            batch_size = 200  # 每批处理的URL数量
            for i in range(1, self.grasp_depth + 1):
                text_name = os.path.join(self.result_dir, f'深度_{i}.txt')  # 当前深度保存的文件名
                for j in range(0, len(self.blog_urls), batch_size):
                    batch = self.blog_urls[j:j + batch_size]
                    await self.process_batch(batch, text_name)
                    await asyncio.sleep(2)  # 控制批次之间的请求节奏
                self.log(f'<span style="color:black;">正在提取深度_{i}.txt主域名</span>')
                domain_urls = self.unique_domains(text_name)  # 提取当前批次的主域名
                extract_text_name = os.path.join(self.result_dir, f'深度_{i}_主域名.txt')
                await self.write_list_to_txt(list(domain_urls), extract_text_name)
                self.log(f'<span style="color:black;">深度_{i}.txt主域名写入深度_{i}_主域名.txt</span>')
                extract_txt_list.append(extract_text_name)
                if i != self.grasp_depth:
                    self.log(f'<span style="color:black;">即将进行深度{i + 1}的抓取</span>')
                    self.blog_urls = self.extract_unique_domains_excluding_previous(extract_txt_list)
            self.log(f'<span style="color:black;">正在写入所有深度主域名</span>')
            self.merge_and_deduplicate_txt_files(extract_txt_list, os.path.join(self.result_dir,
                                                                                f'深度1------------{self.grasp_depth}_主域名.txt'))
            self.log(f'<span style="color:black;">深度1------------{self.grasp_depth}_主域名.txt写入成功</span>')
            self.log(f'<span style="color:black;">程序执行结束.....</span>')
        except Exception as e:
            self.log(f'<span style="color:red;">Main function error: {e}</span>')


class WorkerThread(QThread):
    log_signal = pyqtSignal(str)

    def __init__(self, blog_urls, time_out, max_concurrent_tasks, grasp_depth):
        super().__init__()
        self.worker = Worker(blog_urls, time_out, max_concurrent_tasks, self.log_signal, grasp_depth)

    def run(self):
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        loop.run_until_complete(self.worker.main())


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle('批量查询友链_V1.8')
        self.setGeometry(100, 100, 750, 600)

        icon_bytes = QByteArray.fromBase64(icon_data.encode('utf-8'))
        icon_buffer = QBuffer()
        icon_buffer.setData(icon_bytes)
        icon_buffer.open(QIODevice.OpenModeFlag.ReadOnly)
        pixmap = QPixmap()
        pixmap.loadFromData(icon_buffer.data())
        icon = QIcon(pixmap)
        self.setWindowIcon(icon)

        layout = QVBoxLayout()

        self.file_path_label = QLabel('选择域名TXT:（支持http://www.baidu.com，baidu.com）自动解析www')
        layout.addWidget(self.file_path_label)

        self.file_path_input = QLineEdit()
        layout.addWidget(self.file_path_input)

        self.browse_button = QPushButton('浏览')
        self.browse_button.clicked.connect(self.browse_file)
        layout.addWidget(self.browse_button)

        # 创建一个水平布局用于并发线程数的标签和输入框
        thread_layout = QHBoxLayout()
        self.thread_label = QLabel('并发线程数:')
        thread_layout.addWidget(self.thread_label)
        self.thread_input = QSpinBox()
        self.thread_input.setRange(1, 200)
        self.thread_input.setValue(50)
        thread_layout.addWidget(self.thread_input)
        # 添加请求超时时间的标签和输入框
        self.timeout_label = QLabel('请求超时时间(秒):')
        thread_layout.addWidget(self.timeout_label)
        self.timeout_input = QSpinBox()
        # 假设你希望超时时间的范围是1到60秒
        self.timeout_input.setRange(1, 30)
        self.timeout_input.setValue(5)  # 默认设置为30秒
        thread_layout.addWidget(self.timeout_input)
        # 设置抓取深度
        self.grasp_depth_label = QLabel('深度:')
        self.grasp_depth_input = QSpinBox()
        self.grasp_depth_input.setRange(1, 100)
        self.grasp_depth_input.setValue(10)  # 默认设置为30秒
        thread_layout.addWidget(self.grasp_depth_label)
        thread_layout.addWidget(self.grasp_depth_input)
        # 创建一个水平布局用于文件名的标签和输入框
        self.output_filename_label = QLabel('输出文件夹:')
        self.output_filename_input = QLineEdit()
        # 生成一个UUID，并以字符串形式获取（不带'-'）
        self.unique_id = str(uuid.uuid4()).replace('-', '')
        self.output_filename_input.setText(f'友链查询结果_{self.unique_id}')
        thread_layout.addWidget(self.output_filename_label)
        thread_layout.addWidget(self.output_filename_input)
        # 将水平布局添加到垂直布局中
        layout.addLayout(thread_layout)

        self.start_button = QPushButton('开始')
        self.start_button.clicked.connect(self.start_scraping)
        layout.addWidget(self.start_button)

        self.console_output = QTextEdit()
        self.console_output.setReadOnly(True)
        layout.addWidget(self.console_output)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def browse_file(self):
        global first_file_path
        file_path, _ = QFileDialog.getOpenFileName(self, "选择TXT文件", "", "TXT Files (*.txt)")
        if file_path:
            self.file_path_input.setText(file_path)
            first_file_path = self.file_path_input.text()

    def log(self, message):
        timestamp = QDateTime.currentDateTime().toString()
        if "成功" in message:
            html_info = f'<span style="color:blue;">[{timestamp}]</span> <span style="color:green;">{message}</span>'
            self.console_output.append(html_info)
        else:
            html_info = f'<span style="color:blue;">[{timestamp}]</span> <span style="color:red;">{message}</span>'
            self.console_output.append(html_info)

    def start_scraping(self):
        global result_dir  # 当前脚本目录
        time_out = self.timeout_input.text()
        file_path = self.file_path_input.text()  # 要处理文件的地址
        thread_count = self.thread_input.value()  # 并发线程数
        file_name = self.output_filename_input.text()  # 输出文件夹
        result_dir = os.path.join(script_dir, f'{file_name}')  # 输出文件夹 = 脚本目录 + 输出文件夹
        grasp_depth_input = self.grasp_depth_input.value()  # 抓取深度
        if not file_path:
            self.log("请先选择一个TXT文件路径。")
            return
        timestamp = QDateTime.currentDateTime().toString()
        self.console_output.append(f'<span style="color:blue;">[{timestamp}]</span> <span '
                                   f'style="color:black;">程序开始执行.....</span>')
        with open(file_path, 'r', encoding='utf-8') as file:
            blog_urls = [line.strip() for line in file.readlines()]
        self.worker_thread = WorkerThread(blog_urls, int(time_out), thread_count, grasp_depth_input)
        self.worker_thread.log_signal.connect(self.log)
        self.worker_thread.start()


if __name__ == '__main__':
    try:
        app = QApplication(sys.argv)
        main_window = MainWindow()
        main_window.show()
        main_window.log(f'<span style="color:black;">欢迎使用本软件.....</span>')
        main_window.log(f'<span style="color:black;">本软件用于收集站点友情链接.....</span>')
        #         main_window.log(f'<span>更新V1.6:</span>')
        #         main_window.log(f'<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.设置深度抓取，自动去重</span>')
        #         main_window.log(f'<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.自动跟随重定向</span>')
        #         main_window.log(f'<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.配置连接池的最大连接数和保持连接数，保持运行稳定</span>')

        sys.exit(app.exec())
    except Exception as e:
        with open('error_log.txt', 'a', encoding='utf-8') as log_file:
            log_file.write(f'Error during GUI initialization: {e}\n')
            log_file.write(traceback.format_exc())
